package com.wondertek.onvif.repository;

import com.wondertek.onvif.entity.OnvifDevice;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * ONVIF设备数据访问层
 * 
 * @author wondertek
 * @version 1.0.0
 */
@Repository
public interface OnvifDeviceRepository extends JpaRepository<OnvifDevice, Long> {

    /**
     * 根据设备ID查找设备
     * 
     * @param deviceId 设备ID
     * @return 设备信息
     */
    Optional<OnvifDevice> findByDeviceId(String deviceId);

    /**
     * 根据IP地址查找设备
     * 
     * @param ipAddress IP地址
     * @return 设备信息
     */
    Optional<OnvifDevice> findByIpAddress(String ipAddress);

    /**
     * 根据IP地址和端口查找设备
     * 
     * @param ipAddress IP地址
     * @param port 端口
     * @return 设备信息
     */
    Optional<OnvifDevice> findByIpAddressAndPort(String ipAddress, Integer port);

    /**
     * 查找所有启用的设备
     * 
     * @return 启用的设备列表
     */
    List<OnvifDevice> findByEnabledTrue();

    /**
     * 根据状态查找设备
     * 
     * @param status 设备状态
     * @return 设备列表
     */
    List<OnvifDevice> findByStatus(OnvifDevice.DeviceStatus status);

    /**
     * 根据制造商查找设备
     * 
     * @param manufacturer 制造商
     * @return 设备列表
     */
    List<OnvifDevice> findByManufacturer(String manufacturer);

    /**
     * 根据设备名称模糊查询
     * 
     * @param name 设备名称关键字
     * @return 设备列表
     */
    List<OnvifDevice> findByNameContainingIgnoreCase(String name);

    /**
     * 查询在线设备数量
     * 
     * @return 在线设备数量
     */
    @Query("SELECT COUNT(d) FROM OnvifDevice d WHERE d.status = com.wondertek.onvif.entity.OnvifDevice$DeviceStatus.ONLINE")
    long countOnlineDevices();

    /**
     * 查询离线设备数量
     * 
     * @return 离线设备数量
     */
    @Query("SELECT COUNT(d) FROM OnvifDevice d WHERE d.status = com.wondertek.onvif.entity.OnvifDevice$DeviceStatus.OFFLINE")
    long countOfflineDevices();

    /**
     * 查询启用设备数量
     * 
     * @return 启用设备数量
     */
    @Query("SELECT COUNT(d) FROM OnvifDevice d WHERE d.enabled = true")
    long countEnabledDevices();

    /**
     * 查询禁用设备数量
     * 
     * @return 禁用设备数量
     */
    @Query("SELECT COUNT(d) FROM OnvifDevice d WHERE d.enabled = false")
    long countDisabledDevices();

    /**
     * 根据IP地址段查找设备
     * 
     * @param ipPrefix IP地址前缀
     * @return 设备列表
     */
    @Query("SELECT d FROM OnvifDevice d WHERE d.ipAddress LIKE :ipPrefix%")
    List<OnvifDevice> findByIpAddressPrefix(@Param("ipPrefix") String ipPrefix);

    /**
     * 检查IP地址和端口是否已存在（排除指定ID）
     * 
     * @param ipAddress IP地址
     * @param port 端口
     * @param excludeId 排除的设备ID
     * @return 是否存在
     */
    @Query("SELECT COUNT(d) > 0 FROM OnvifDevice d WHERE d.ipAddress = :ipAddress AND d.port = :port AND d.id != :excludeId")
    boolean existsByIpAddressAndPortExcludingId(@Param("ipAddress") String ipAddress, 
                                                @Param("port") Integer port, 
                                                @Param("excludeId") Long excludeId);
}